﻿using ServiceStack.Redis;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography.X509Certificates;
using System.Text;

namespace RedisDemo
{
    /// <summary>
    /// set 和zset 主要是对集合的操作，提供了对集合各种数据组合，排序，搜索的功能。
    /// </summary>
    public class SetAndZSet
    {

        public static void Show()
        {
            using (RedisClient client = new RedisClient("127.0.0.1", 6379))
            {
                //删除当前数据库中的所有Key  默认删除的是db0
                client.FlushDb();
                //删除所有数据库中的key 
                client.FlushAll();

                string key = "keyiwang";

                #region 添加键值，自带去重功能
                //同一个key，可以添加多个值；同一个key，同一个值，不会重复写入，可用于投票、点赞之类，达到同一个ip或同一个账号不能重复操作
                //client.AddItemToSet(key, "张三丰");
                //client.AddItemToSet(key, "张三丰");
                //client.AddItemToSet(key, "火工头陀");

                //foreach (var item in client.GetAllItemsFromSet(key))
                //{
                //    Console.WriteLine(item);
                //}

                #endregion

                #region 随机获取key集合中的一个值，获取当前setid所有值
                //client.AddRangeToSet(key, new List<string>() { "张三", "张三", "李四", "王五" });
                ////当前setid中值的数量
                //Console.WriteLine("数量：" + client.GetSetCount(key));
                ////随机获取key中的一个值
                //Console.WriteLine("随机值：" + client.GetRandomItemFromSet(key));
                ////获取当前setid中所有的值
                //var lists = client.GetAllItemsFromSet(key);
                //foreach (var item in lists)
                //{
                //    Console.WriteLine(item);

                //}

                #endregion


                #region 并集，把两个集合合并起来，去重

                //client.AddRangeToSet("key1", new List<string>() { "001", "002", "003", "004" });
                //client.AddRangeToSet("key2", new List<string>() { "001", "003", "005", "006" });

                //var unionlist = client.GetUnionFromSets("key1", "key2"); //合并
                //Console.WriteLine("返回并集结果");
                //foreach (var item in unionlist)
                //{
                //    Console.WriteLine(item);
                //}

                ////把 key1和key2 并集结果存放到newkey集合中
                //client.StoreUnionFromSets("newkey", "key1", "key2");

                //Console.WriteLine("返回并集结果的新集合数据");
                //foreach (var item in client.GetAllItemsFromSet("newkey"))
                //{
                //    Console.WriteLine(item);
                //}

                #endregion

                #region 交集，获取两个集合中共同的元素

                //client.AddRangeToSet("key1", new List<string>() { "001", "002", "003", "004" });
                //client.AddRangeToSet("key2", new List<string>() { "001", "003", "005", "006" });
                //client.AddRangeToSet("key3", new List<string>() { "000", "007", "008", "009" });
                //var intersectList = client.GetIntersectFromSets("key1", "key2","key3");
                //Console.WriteLine("返回交集结果的新集合数据");
                //foreach (var item in intersectList)
                //{
                //    Console.WriteLine(item);
                //}
                ////把 key1和key2 并集结果存放到newkey集合中
                //client.StoreIntersectFromSets("newkey", "key1", "key2");

                //Console.WriteLine("返回交集结果的新集合数据");
                //foreach (var item in client.GetAllItemsFromSet("newkey"))
                //{
                //    Console.WriteLine(item);
                //}

                // 把key1集合中的数据与key2集合中的数据对比，fromkey集合中不存在keys集合中，则把这些不存在的数据放入newkey集合中
                //client.StoreDifferencesFromSet("key3", "key1", "key2");
                //foreach (var item in client.GetAllItemsFromSet("key3"))
                //{
                //    Console.WriteLine(item);
                //}


                #endregion


                #region ZSet的操作
                //zset就是set的一个分支版本，它增加了一个分值，比如权重。能够按照分值进行排序。

                // client.AddItemToSortedSet(key, "aa", 100);


                client.AddItemToSortedSet(key, "关羽", 2);
                client.AddItemToSortedSet(key, "刘备", 1);
                client.AddItemToSortedSet(key, "张飞", 3);
                //获取当前value的结果,排序，升序
                //foreach (var item in client.GetAllItemsFromSortedSet(key))
                //{
                //    Console.WriteLine(item);
                //}
                //获取分值2到3范围内的数据，查询出来就是关羽和张飞满足
                //var list= client.GetRangeFromSortedSetByHighestScore(key, 2, 3);


                //var list = client.GetRangeFromSortedSet(key, 0, 1); //按下标索引 0,先排序，默认是升序，升序完后取第N-M个数（含NM），类似分页
                //foreach (var item in list)
                //{
                //    Console.WriteLine(item);
                //}

                #endregion

                //更多zset用法，参考https://www.cnblogs.com/knowledgesea/p/5032101.html




            }

        }
    }
}
